// 通过结构体创建变量的方式有三种：
//   struct 结构体名 变量名
//   struct 结构体名 变量名 = { 成员1值 ， 成员2值...}
//   定义结构体时顺便创建变量

#include <iostream>
using namespace std;

void create_struct_variable();  // 创建结构体变量
void struct_array();  // 结构体数组
void struct_point();  // 结构体指针
void struct_nest_struct();  // 结构体嵌套结构体

struct student
{
    string name;
    int age;
    int score;
} stu3;  //结构体变量创建方式3 

struct teacher
{
    int id;
    string name;
    int age;
    struct student stu;
};

void create_struct_variable()
{
    // 创建结构体变量方式1
    struct student stu1;  // struct 可以省略
    stu1.name = "merdith";
    stu1.age = 18;
    stu1.score = 8;
    cout << "姓名：" << stu1.name << " 年龄：" << stu1.age  << " 分数：" << stu1.score << endl;

    // 创建结构体变量方式2
    struct student stu2 = {"alis", 11, 9};
    cout << "姓名：" << stu2.name << " 年龄：" << stu2.age  << " 分数：" << stu2.score << endl;

    stu3.name = "jordan";
	stu3.age = 18;
	stu3.score = 5;
	
	cout << "姓名：" << stu3.name << " 年龄：" << stu3.age  << " 分数：" << stu3.score << endl;
}

void struct_array()
{
    // 结构体数组
    // 将自定义的结构体放入到数组中方便维护
    
    cout << "struct array" << endl;

    struct student arr[] = {
        {"zhang", 10, 4},
        {"wang", 12, 5},
        {"li", 11, 9},
    };

    for (int i = 0; i < 3; i++)
        cout << "姓名：" << arr[i].name << " 年龄：" << arr[i].age << " 分数：" << arr[i].score << endl;

}

void struct_point()
{
    // 结构体指针
    // 通过指针访问结构体中的成员 用操作符 ->

    cout << "struct point" << endl;

    struct student stu = {"alix", 11, 8};
    struct student *p = &stu;
    
    p->score = 2;
    cout << "姓名：" << p->name << " 年龄：" << p->age << " 分数：" << p->score << endl; 
}

void struct_nest_struct()
{
    // 结构体嵌套结构体
    cout << "struct nest struct" << endl;

    struct teacher t1;
    t1.id = 1;
    t1.name = "wang";
    t1.age = 25;
    t1.stu = {"alix", 11, 8};

    cout << "教师 职工编号： " << t1.id << " 姓名： " << t1.name << " 年龄： " << t1.age << endl;
	
	cout << "辅导学员 姓名： " << t1.stu.name << " 年龄：" << t1.stu.age << " 考试分数： " << t1.stu.score << endl;

}

int main()
{
    create_struct_variable();
    struct_array();
    struct_point();
    struct_nest_struct();
    return 0;
}